(function () {
    /**
     * SweetAlert2 Toast 管理器 （https://sweetalert2.github.io/）
     * 提供三种预设样式：
     * 1. 确认+取消对话框
     * 2. 重置对话框
     * 3. 纯自动消失提示
     * 4. 纯自动消失提示
     * - position 可选值：
     * 'top'	       页面顶部	         需要引起强烈注意的警告
     * 'top-start'	   页面顶部左侧	     左侧对齐的顶部通知
     * 'top-end'	   页面顶部右侧	     适合通知栏/系统消息
     * 'center'	       页面正中（默认值） 标准对话框
     * 'center-start'  页面中部偏左	     较少使用
     * 'center-end'	   页面中部偏右	     较少使用
     * 'bottom'	       页面底部	         非侵入式提示
     * 'bottom-start'  页面底部左侧	     聊天工具提示
     * 'bottom-end'	   页面底部右侧	     右下角通知（常见设计模式）
     * +-------------------------------+
     * | top-start      top      top-end
     * |                               |
     * |                               |
     * | center-start  center  center-end
     * |                               |
     * |                               |
     * | bottom-start  bottom  bottom-end
     * +-------------------------------+
     */
    class ToastManager {

        constructor() {
            // 基础配置
            this.BASE_CONFIG = {
                toast: false,                                                     // 启用 Toast 模式
                position: 'center',                                               // 显示位置，可选 top, top-start, top-end, center, center-start, center-end, bottom, bottom-start, bottom-end
                animation: true,                                                  // 启动动画
                timerProgressBar: true,                                           //显示进度条
                didOpen: (toast) => { // Toast 打开时的回调
                    toast.addEventListener('mouseenter', window.Swal.stopTimer)   // 悬停时暂停计时
                    toast.addEventListener('mouseleave', window.Swal.resumeTimer) // 离开时恢复计时
                },
                customClass: {
                    container: 'swal2-z-index-top'                                // z-index 置顶
                },
                buttonsStyling: false,                                            // 启用默认样式
            }

            // 三种预设样式配置
            this.PRESETS = {
                // 类型1：确认 + 取消对话框
                confirm: {
                    showConfirmButton: true,                                      // 显示确认按钮
                    showCancelButton: true,                                       // 显示取消按钮
                    confirmButtonText: '确认',                                    // 确认按钮文本
                    cancelButtonText: '取消',                                     // 取消按钮文本
                    customClass: {
                        confirmButton: 'btn btn-primary',                         // 确认按钮样式
                        cancelButton: 'btn btn-outline-secondary'                 // 取消按钮样式
                    }
                },

                // 类型2：重置对话框
                reset: {
                    showConfirmButton: true,                                      // 显示确认按钮
                    showCancelButton: true,                                       // 显示取消按钮
                    confirmButtonText: '确认重置',                                // 确认按钮文本
                    cancelButtonText: '取消操作',                                 // 取消按钮文本
                    reverseButtons: false,                                        // 反转按钮顺序，取消按钮在左侧
                    customClass: {
                        confirmButton: 'btn btn-primary',                         // 确认按钮样式
                        cancelButton: 'btn btn-outline-secondary'                 // 取消按钮样式
                    }
                },

                // 类型3：仅确认按钮
                alert: {
                    timer: 3000,                                                  // 3秒后自动关闭
                    showConfirmButton: true,                                      // 显示确认按钮
                    confirmButtonText: 'OK',                                      // 确认按钮文本
                    customClass: {
                        confirmButton: 'btn btn-info'                             // 确认按钮样式
                    }
                },

                // 类型4：纯提示（自动消失）
                toast: {
                    showConfirmButton: false,                                     // 不显示确认按钮
                    timer: 3000                                                   // 3秒后自动关闭
                }
            }
        }

        /**
         * 快捷方法 - 显示确认对话框
         * @param {object} options
         * @returns {Promise<SweetAlertResult>} - 包含用户选择的结果
         */
        confirm(options) {
            return this.#show('confirm', options);
        }

        /**
         * 快捷方法 - 显示重置对话框
         * @param {object} options
         * @returns {Promise<SweetAlertResult>} - 包含用户选择的结果
         */
        reset(options) {
            return this.#show('reset', options);
        }

        /**
         * 快捷方法 - 显示警告提示
         * @param {object} options
         * @returns {Promise<SweetAlertResult>} - 包含用户选择的结果
         */
        alert(options) {
            return this.#show('alert', options);
        }

        /**
         * 快捷方法 - 显示自动消失提示
         * @param {object} options
         * @returns {Promise<SweetAlertResult>} - 包含用户选择的结果
         */
        toast(options) {
            return this.#show('toast', options);
        }

        /**
         * 显示 Toast
         * @private
         * @param {string} type - 预设类型: 'confirm'|'reset'|'alert'|'toast'
         * @param {object} options - SweetAlert2 配置选项
         * @returns {Promise<SweetAlertResult>} - 包含用户选择的结果
         */
        #show(type = 'toast', options = {}) {
            if (!this.PRESETS[type]) {
                console.warn(`未知的 Toast 类型: ${type}, 默认使用 toast 样式`);
                type = 'toast';
            }

            const mergedConfig = this.#deepMerge(
                {},
                this.BASE_CONFIG,
                this.PRESETS[type],
                {
                    theme: window.darkMode ? 'dark' : 'light',                        // 主题模式
                },
                options
            );

            return window.Swal.fire(mergedConfig);
        }

        /**
       * 深度合并对象 (同名属性覆盖)
       * @private
       */
        #deepMerge(target, ...sources) {
            sources.forEach(source => {
                for (const key in source) {
                    if (source[key] instanceof Object && key in target) {
                        Object.assign(source[key], this.#deepMerge(target[key], source[key]));
                    }
                }
                Object.assign(target, source);
            });
            return target;
        }
    }

    // 自动挂载到全局，用于在生产环境中保护 JavaScript 文件中所有函数不被 Tree Shaking 移除
    window.ToastManager = new ToastManager();
})(window.jQuery);